package com.cvsher.strategypattern.model;

import com.cvsher.strategypattern.behavior.FlyBehavior;
import com.cvsher.strategypattern.behavior.QuackBehavior;

public abstract class Duck {
	
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
	
	/**
	 * 因为每种鸭子的外观都是不一样的，即Duck的每个子类都有不同是实现，因此将display方法设置为抽象方法
	 */
	public abstract void display();
	
	public void swim(){
		System.out.println("swimming...");
	}
	
	/**
	 * 将fly行为委托给FlyBehavior接口进行处理
	 */
	public void performFly(){
		flyBehavior.fly();
	}
	
	/**
	 * 将quack行为委托给QuackBehavior接口进行处理
	 */
	public void performQuack(){
		quackBehavior.quack();
	}
	
	/**
	 * 动态设置FlyBehavior饮用的实例，即动态为Duck绑定fly的策略
	 * @param flyBehavior
	 */
	public void setFlyBehavior(FlyBehavior flyBehavior){
		this.flyBehavior = flyBehavior;
	}
	
	/**
	 * 同setFlyBehavior
	 * @param quackBehavior
	 */
	public void setQuackBehavior(QuackBehavior quackBehavior){
		this.quackBehavior = quackBehavior;
	}
	
}
